文档反馈
文档反馈

网易云信 多窗口合并功能升级说明

云信多窗口合并功能简介

根据一些客户反映的需求,一些情况下会话窗口过多时导致界面比较混乱,为了方便管理多个会话窗口的显示效果,希望增加多会话窗口合并功能。现在已经增加了该功能,但是由于代码改动较大,为了帮助使用旧版本PC Demo的客户顺利增加多窗口合并功能,特意写下升级说明,说明如何在旧代码的基础上增加多窗口合并功能。

多窗口合并功能结构

在旧版本的结构里,一会会话窗口代表一个唯一的会话(P2P或群组会话),与这个会话相关的功能和事件回调都与这个会话窗口绑定在一起。会话窗口对应的XML包含了会话需要的控件信息。也就是会话与会话窗口是对应的关系。

而新版本的结构,为了多窗口合并的需求,一个窗口里面可以容纳下多个会话。这也就导致了许多代码需要改变,不能把会话相关的功能与窗口绑定在一起。现在会话窗口与会话是包含关系。现在把会话窗口与会话拆分为两部分:会话盒子、会话窗口。一个会话的界面内容称之为会话盒子,一个会话窗口可以包含多个会话盒子

在旧版本里,会话功能对应的类为SessionForm,父类是WindowEx;而在新版本里,把会话功能对应的类为SessionBox(会话盒子),父类为VBox,会话窗口对应的类为SessionForm,父类是WindowEx。旧版本的SessionForm功能都修改到SessionBox,而新版的SessionForm几乎不包含会话相关的功能,新版的SessionForm作为SessionBox的容器来管理和维护SessionBox

需要修改的代码

  1. UIKIT下原本所有使用SessionForm类的代码全部替换为SessionBox,这个可以使用全局替换功能
  2. SessionManager::GetInstance()->Find()改名为SessionManager::GetInstance()->FindSessionBox()
  3. 原本使用WindowsManager::GetInstance()->GetWindow()方法查找会话窗口的代码全部改成SessionManager::GetInstance()->FindSessionBox()来查找。这个很重要,因为现在的SessionForm已经不具备会话相关的功能了。

  4. SessionManager::GetInstance()->OpenSessionForm()改名为SessionManager::GetInstance()->OpenSessionBox()

  5. SessionBox类继承VBox
  6. SessionBox类增加SetSessionFormGetSessionForm方法
  7. SessionBox类的InitWindow方法改为InitSessionBox方法
  8. SessionBox类的OnFinalMessage方法改为UninitSessionBox方法
  9. SessionBox类中关于需要使用窗体句柄的地方重新修改
  10. SessionBox类中关于修改窗口标题修改窗口任务栏图标闪动任务栏修改窗口尺寸等与窗口有关的操作都要传递给SessionForm去做

需要改动的文件

其中改动最多的代码其中在: tool_kits\ui_component\ui_kit\gui\session目录下session_form开头的文件 tool_kits\ui_component\ui_kit\gui\session目录下session_box开头的文件 tool_kits\ui_component\ui_kit\module\session目录下session_manager开头的文件

Duilib增加的文件

云信Duilib修改了ControlWindowRichEdit组件 其中Control增加了DetachEvent方法,用于释放某个事件对应的的消息处理器 RichEdit重写了了SetWindow方法,用于重新注册RichEdit所属的窗口

UIKIT增加的文件

  1. tool_kits\ui_component\ui_kit\module\dragdrop目录中增加drag_drop.hdrag_drop.cpp文件
  2. tool_kits\ui_component\ui_kit\gui\session\dragdrop目录中增加drag_form.hdrag_form.cppbitmap_control.cppbitmap_control.cpp文件
  3. tool_kits\ui_component\ui_kit\gui\session\control目录中增加merge_item.hmerge_item.cpp文件
  4. tool_kits\ui_component\ui_kit\gui\session目录中的原session_form开头的文件改为session_box开头
  5. tool_kits\ui_component\ui_kit\gui\session目录中增加session_form.hsession_form.cppsession_form_dragdrop.cpp文件

XML增加的文件

bin\themes\default\session目录中增加了drag_form.xmlmerge_item.xmlsession_form.xml 把原本的session.xml改为session_box.xml session_box.xml中的名为closebtnminbtn的按钮改名为btn_closebtn_min

开启或关闭多窗口合并功能

tool_kits\ui_component\ui_kit\export目录中的nim_ui_session_manager.h文件对应uikit导出的SessionManager类,其中新增了SetEnableMergeIsEnableMergeSetUseCustomDragImageIsUseCustomDragImage等函数。

通过调用SetEnableMerge函数可以开启或者关闭多窗口合并功能,默认为开启。如果关闭了多窗口合并功能,那么会话窗口的行为和外观就和老版本的一致了。

示例代码如下:

nim_ui::SessionManager::GetInstance()->SetEnableMerge(false);

多窗口合并功能注意点

在拖拽会话盒子时,会出现一个拖拽的缩略图效果。这个缩略图的实现方法有两个:

  1. 使用系统的拖拽效果接口,好处是兼容性好;缺点是如果拖拽到其他程序的窗口上,如果对方窗口不支持拖入,那么拖拽效果图就会消失,影响外观。
  2. 使用自定的拖拽效果接口,好处是在任何情况下都可以顺利显示拖拽效果,并且可以通过修改代码自定义拖拽的效果;缺点是拖拽的实现用到了低级键盘钩子,一些安全软件会拦截我们的程序,如果使用自定义拖拽效果需要申请去对应的安全软件里申请白名单。

默认情况下开启了自定义拖拽效果,开启或关闭自定义拖拽效果示例如下代码如下:

nim_ui::SessionManager::GetInstance()->SetUseCustomDragImage(false);
×

反馈成功

非常感谢您的反馈,我们会继续努力做得更好。